#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>


/**
 * 从给定的字符串中提取数字，并将这些数字存储在整数数组中。
 *
 * @param str   指向输入字符串的指针，包含要提取的数字。
 * @param arr   指向整数数组的指针，用于存储提取的数字。
 * @param size  指向整数的指针，用于返回提取的数字的数量。
 */
void extractNumbers(char *str, int *arr, int *size) {
    int count = 0;
    int num = 0;
    int isNum = 0; // 标记当前是否在处理一个数字
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            num = num * 10 + (str[i] - '0'); // 将字符转换为整数并累加到num
            isNum = 1; // 设置标记为1，表示当前在处理一个数字
        } else {
            if (isNum) { // 如果前一个字符是数字，则将num添加到数组中
                arr[count] = num;
                count++;
                num = 0; // 重置num
                isNum = 0; // 重置标记
            }
        }
    }
    if (isNum) { // 如果字符串以数字结尾，则将最后一个数字添加到数组中
        arr[count] = num;
        count++;
    }
    *size = count;
}



/**
 * @brief 移除数组中的所有零元素，并将非零元素移动到数组的前面。
 *
 * 该函数遍历输入的整数数组，将非零元素移动到数组的前面，并更新数组的长度，
 * 以去掉所有零元素。函数通过指针参数返回新的数组长度。
 *
 * @param arr 输入的整数数组。
 * @param n 指向整数变量的指针，表示数组的长度。函数执行后，该变量将更新为去掉零元素后的数组长度。
 */
void removeZeros(int arr[], int *n) {
    int count = 0; // 用于记录非零元素的数量

    // 遍历数组
    for (int i = 0; i < *n; i++) {
        // 如果当前元素不是0，则将其移动到前面
        if (arr[i] != 0) {
            arr[count] = arr[i]; // 将非零元素移动到数组的前面
            count++; // 增加非零元素的计数
        }
    }

    // 更新数组的长度，去掉所有0元素后的长度
    *n = count; // 将非零元素的数量赋值给原数组的长度，即去掉所有0元素后的长度
}


// 函数声明：removeChar
// 参数：
//   str: 指向字符数组的指针，表示要处理的字符串
//   remove: 要从字符串中移除的字符
//   n: 指向整数的指针，表示字符串的当前长度，函数执行后更新为移除字符后的新长度
void removeChar(char *str, char remove, int *n) {
    // 初始化计数器count，用于记录移除指定字符后的新字符串长度
    int count = 0;
    // 遍历字符串的每一个字符
    for (int i = 0; i < *n; i++) {
        // 如果当前字符不等于要移除的字符
        if (str[i] != remove) {
            // 将当前字符复制到新位置
            str[count] = str[i];
            // 更新计数器，表示新字符串的长度增加
            count++;
        }
    }
    // 更新字符串的实际长度为移除指定字符后的新长度
    *n = count;
}

// 函数声明：removeNullChars
// 功能：移除字符串中的所有空字符（'\0'）
// 参数：char *str - 指向待处理字符串的指针
void removeNullChars(char *str) {
    // 变量声明：count
    // 用途：用于记录非空字符的数量，同时也是新字符串的索引
    int count = 0;
    // for循环遍历字符串
    // 条件：str[i] != '\0'，即遍历到字符串的末尾（'\0'）为止
    for (int i = 0; str[i]; i++) {
        // 如果当前字符不是空字符（'\0'）
        if (str[i] != '\0') {
            // 将当前字符复制到字符串的前count位置
            str[count++] = str[i];
        }
    }
    // 在处理完所有非空字符后，将字符串末尾设置为空字符（'\0'）
    // 以确保字符串正确终止
    str[count] = '\0';
}

int main(int argc, char *argv[])
{

    // 定义变量
    int num1, num2, result;
    char operator;
    int countt = 0;
    int numbers[100];
    char ops[100];
    char input[100];

    // 提示用户输入一个简单的数学表达式
    printf("请输入一个简单的数学表达式（例如：2 + 3）：");
    fgets(input, 100, stdin); // 读取用户输入的表达式
    // 遍历输入字符串，提取数字
    for (int i = 0; i < strlen(input); i++)
    {
        if (input[i] >= '0' && input[i] <= '9')
        {
            numbers[countt] = input[i] - '0'; // 将字符转换为整数
            countt++;
        }
    }
    int op_count = 0;
    // 遍历输入字符串，提取运算符
    for (int i = 0; i < strlen(input); i++)
    {
        if (input[i] == '-' || input[i] == '+' || input[i] == '*' || input[i] == '/' || input[i] == '%')
        {
            ops[op_count] = input[i];
            op_count++;
        }
    }

    // 打印提取的数字和运算符
    for (int i = 0; i < countt; i++)
    {
        printf("%d.number: %d\n", i,numbers[i]);
    }
    for (int i = 0; i < op_count; i++)
    {
        printf("%d.operator: %c\n",i, ops[i]);
    }


    int muli = 0;
    // 计算乘法
    for (size_t i = 0; i < op_count; i++)
    {

        if (ops[i] == '*')
        {
            muli = i;
            numbers[i + 1] = numbers[muli] * numbers[i + 1]; // 计算乘法
            numbers[i] = 0;
            ops[i] = '0';
            // op_count--;
        }

    }
    removeZeros(numbers, &countt); // 去掉所有0元素
    //removeZeros(ops, &op_count); // 去掉所有0元素
    removeChar(ops, '0', &op_count); // 去掉所有0元素

    for (size_t i = 0; i < op_count; i++)
    {
        if (ops[i] == '/')
        {

            numbers[i + 1] = numbers[i] / numbers[i + 1]; // 计算除法
            numbers[i] = 0;
            ops[i] = '0';
            // op_count--;
        }
    }
    removeZeros(numbers, &countt); // 去掉所有0元素
    // removeZeros(ops, &op_count); // 去掉所有0元素
    removeChar(ops, '0', &op_count); // 去掉所有0元素

    //乘法与除法完成后数组是
    printf("乘法与除法完成后数组是：\n");
    for (int i = 0; i < countt; i++)
    {
        printf("%d.number: %d\n", i,numbers[i]);
    }
    for (int i = 0; i < op_count; i++)
    {
        printf("%d.operator: %c\n",i, ops[i]);
    }
    printf("-----------------\n"); // 输出计算结果
    //---------------------------------------


    for (int i = 0; i < op_count; i++){
        if (ops[i] == '+')
        {
            numbers[i + 1] = numbers[i] + numbers[i + 1]; // 计算加法
            numbers[i] = 0;
            ops[i] = '0';
        }

    }
    removeZeros(numbers, &countt); // 去掉所有0元素
    // removeZeros(ops, &op_count); // 去掉所有0元素
    removeChar(ops, '0', &op_count); // 去掉所有0元素

    for (int i = 0; i < op_count; i++){
        if (ops[i] == '-')
        {
            numbers[i + 1] = numbers[i + 1] - numbers[i]; // 计算减法
            numbers[i] = 0;
            ops[i] = '0';
        }

    }
    removeZeros(numbers, &countt); // 去掉所有0元素
    // removeZeros(ops, &op_count); // 去掉所有0元素
    removeChar(ops, '0', &op_count); // 去掉所有0元素

    printf("计算结果为：%d\n", numbers[0]); // 输出计算结果


    return 0;
}